home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / comm / wxtermsr.zip / WXTMXFER.INC < prev   
Text File  |  1988-02-12  |  41KB  |  1,043 lines

  1. {$U-,C-,R-,K-}
  2.   {   - originally written by:
  3. Scott Murphy
  4. 77 So. Adams St. #301
  5. Denver, CO 80209
  6. Compuserve 70156,263
  7.   }
  8.   {   - modified to add CRC xmodem, wxmodem 7/86 - 10/86
  9. Peter Boswell
  10. ADI
  11. Suite 650
  12. 350 N. Clark St.
  13. Chicago, Il 60610
  14. People/Link: Topper
  15. Compuserve : 72247,3671
  16.   }
  17. CONST
  18.      SOH = 1;                          {Start Of Header}
  19.      EOT = 4;                          {End Of Transmission}
  20.      ACK = 6;                          {ACKnowledge}
  21.      DLE = $10;                        {Data Link Escape}
  22.      XON = $11;                        {X-On}
  23.      XOFF = $13;                       {X-Off}
  24.      NAK = $15;                        {Negative AcKnowledge}
  25.      SYN = $16;                        {Synchronize}
  26.      CAN = $18;                        {CANcel}
  27.      CHARC = $43;                      {C = CRC Xmodem}
  28.      CHARW = $57;                      {W = WXmodem}
  29.      MAXERRS = 10;                     {Maximum allowed errors}
  30.      L = 0;
  31.      H = 1;
  32.      BufLen  = 128;                    {Disk I/O buffer length}
  33.      Bufnum = 64;                      {Disk I/O buffer count}
  34.      Maxwindow = 4;                    {Wxmodem window size}
  35.                                        {CRC byte translation table}
  36.      Crctab: ARRAY[0..255] OF INTEGER =
  37.      (0, 4129, 8258, 12387, 16516, 20645, 24774, 28903,
  38.       -32504,-28375,-24246,-20117,-15988,-11859,-7730,-3601,
  39.       4657, 528, 12915, 8786, 21173, 17044, 29431, 25302,
  40.       -27847,-31976,-19589,-23718,-11331,-15460,-3073,-7202,
  41.       9314, 13379, 1056, 5121, 25830, 29895, 17572, 21637,
  42.       -23190,-19125,-31448,-27383,-6674,-2609,-14932,-10867,
  43.       13907, 9842, 5649, 1584, 30423, 26358, 22165, 18100,
  44.       -18597,-22662,-26855,-30920,-2081,-6146,-10339,-14404,
  45.       18628, 22757, 26758, 30887, 2112, 6241, 10242, 14371,
  46.       -13876,-9747,-5746,-1617,-30392,-26263,-22262,-18133,
  47.       23285, 19156, 31415, 27286, 6769, 2640, 14899, 10770,
  48.       -9219,-13348,-1089,-5218,-25735,-29864,-17605,-21734,
  49.       27814, 31879, 19684, 23749, 11298, 15363, 3168, 7233,
  50.       -4690,-625,-12820,-8755,-21206,-17141,-29336,-25271,
  51.       32407, 28342, 24277, 20212, 15891, 11826, 7761, 3696,
  52.       -97,-4162,-8227,-12292,-16613,-20678,-24743,-28808,
  53.       -28280,-32343,-20022,-24085,-12020,-16083,-3762,-7825,
  54.       4224, 161, 12482, 8419, 20484, 16421, 28742, 24679,
  55.       -31815,-27752,-23557,-19494,-15555,-11492,-7297,-3234,
  56.       689, 4752, 8947, 13010, 16949, 21012, 25207, 29270,
  57.       -18966,-23093,-27224,-31351,-2706,-6833,-10964,-15091,
  58.       13538, 9411, 5280, 1153, 29798, 25671, 21540, 17413,
  59.       -22565,-18438,-30823,-26696,-6305,-2178,-14563,-10436,
  60.       9939, 14066, 1681, 5808, 26199, 30326, 17941, 22068,
  61.       -9908,-13971,-1778,-5841,-26168,-30231,-18038,-22101,
  62.       22596, 18533, 30726, 26663, 6336, 2273, 14466, 10403,
  63.       -13443,-9380,-5313,-1250,-29703,-25640,-21573,-17510,
  64.       19061, 23124, 27191, 31254, 2801, 6864, 10931, 14994,
  65.       -722,-4849,-8852,-12979,-16982,-21109,-25112,-29239,
  66.       31782, 27655, 23652, 19525, 15522, 11395, 7392, 3265,
  67.       -4321,-194,-12451,-8324,-20581,-16454,-28711,-24584,
  68.       28183, 32310, 20053, 24180, 11923, 16050, 3793, 7920);
  69.  
  70. {*** variables used as globals in this source segment
  71.      (actually global to whole  source) ***}
  72. VAR
  73.    checksum     : INTEGER;
  74.    fname        : bigstring;
  75.    response     : STRING[1];
  76.    crcval,db,sb : INTEGER;
  77.    packetln     : INTEGER;            {128 + Checksum or 128 + CRC}
  78.    p            : parity_set;
  79.    dbuffer      : ARRAY[1..Bufnum,1..BufLen] OF Byte;
  80.    dcount       : INTEGER;
  81.    Wxmode       : BOOLEAN;
  82.    Crcmode      : BOOLEAN;
  83.    Openflag     : BOOLEAN;
  84.  
  85. PROCEDURE updcrc(a : Byte);
  86. BEGIN
  87.   {
  88.      crcval := Crctab[hi(crcval) xor a] xor (lo(crcval) shl 8);
  89.   }
  90.      InLine(
  91.  
  92.         $A1/crcval/       {mov ax,crcval     AX <- crcval}
  93.         $89/$C2/          {mov dx,ax         DX <- crcval}
  94.         $88/$E0/          {mov al,ah         (AX) crcval >> 8}
  95.         $B4/$00/          {mov ah,0 }
  96.         $36/              {ss:}
  97.         $8B/$8E/a/        {mov cx,[bp+a]     CX <- a}
  98.         $31/$C8/          {xor ax,cx         AX <- (crcval >> 8) xor a}
  99.         $D1/$E0/          {shl ax,1          AX <- AX * 2  (word index)}
  100.         $BB/crctab/       {mov bx,offset crctab   BX <- addr(crctab)}
  101.         $01/$C3/          {add bx,ax         BX <- addr(crctab)+((crcval>>8)xor a)*2 }
  102.         $2E/              {cs:}
  103.         $8B/07/           {mov ax,[bx]       AX <- contents of crctab}
  104.         $88/$D6/          {mov dh,dl         (DX) crcval << 8}
  105.         $B2/$00/          {mov dl,00}
  106.         $31/$D0/          {xor ax,dx         AX <- contents of crctab xor crcval << 8}
  107.         $A3/crcval        {mov crcval,ax     crcval <- AX}
  108.  
  109.           );
  110. END;
  111.  
  112. { Xmodem transmit window routine
  113.   Peter Boswell, July 1986       }
  114.  
  115. PROCEDURE txwindow(opt : INTEGER; in_string : bigstring);
  116.  
  117. BEGIN
  118.    CASE opt OF
  119.        1  :     BEGIN                           {initialize}
  120.                    OpenTemp(36,3,78,18,2);
  121.                    ClrScr;
  122.                    GotoXY(10,1);
  123.                    WRITE('File - ',in_string);
  124.                    GotoXY(10,2);
  125.                    WRITE('Mode -');
  126.                    GotoXY(4,3);
  127.                    WRITE('Total time -');
  128.                    GotoXY(2,4);
  129.                    WRITE('Total Blocks -');
  130.                    GotoXY(10,5);
  131.                    WRITE('Sent -');
  132.                    GotoXY(9,6);
  133.                    WRITE('ACK''d -');
  134.                    GotoXY(6,7);
  135.                    WRITE('Last NAK -');
  136.                    GotoXY(9,8);
  137.                    WRITE('X-Off - No');
  138.                    GotoXY(8,9);
  139.                    WRITE('Window - 0');
  140.                    GotoXY(4,11);
  141.                    WRITE('Last Error -');
  142.                    GotoXY(8,10);
  143.                    WRITE('Errors -');
  144.                 END;
  145.        2..11  : BEGIN
  146.                    GotoXY(17,opt);
  147.                    ClrEol;
  148.                    WRITE(in_string);
  149.                 END;
  150.        12     : BEGIN
  151.                    GotoXY(3,12);
  152.                    ClrEol;
  153.                    WRITE(in_string);
  154.                 END;
  155.        99     : CloseTemp;
  156.    END;                                         {case}
  157. END;
  158. { Xmodem receive window routine
  159.   Peter Boswell, October 1986       }
  160.  
  161. PROCEDURE trwindow(opt : INTEGER; in_string : bigstring);
  162.  
  163. BEGIN
  164.    CASE opt OF
  165.        1  :     BEGIN                           {initialize}
  166.                    OpenTemp(36,3,78,13,2);
  167.                    ClrScr;
  168.                    GotoXY(10,1);
  169.                    WRITE('File - ',in_string);
  170.                    GotoXY(10,2);
  171.                    WRITE('Mode -');
  172.                    GotoXY(6,3);
  173.                    WRITE('Received -');
  174.                    GotoXY(6,4);
  175.                    WRITE('Last NAK -');
  176.                    GotoXY(4,5);
  177.                    WRITE('Last Error -');
  178.                    GotoXY(8,6);
  179.                    WRITE('Errors -');
  180.                 END;
  181.        2..6   : BEGIN
  182.                    GotoXY(17,opt);
  183.                    ClrEol;
  184.                    WRITE(in_string);
  185.                 END;
  186.        8      : BEGIN
  187.                    GotoXY(3,8);
  188.                    ClrEol;
  189.                    WRITE(in_string);
  190.                 END;
  191.        99     : CloseTemp;
  192.    END;                                         {case}
  193. END;
  194. {
  195.   This routine deletes all DLE characters and XOR's the following character
  196.   with 64.  If a SYN character is found then -2 is returned.
  197.     }
  198. FUNCTION dlecgetc(Tlimit : INTEGER) : INTEGER;
  199. VAR
  200. savecgetc : INTEGER;
  201. BEGIN
  202.      IF wxmode THEN
  203.      BEGIN
  204.           savecgetc := cgetc(Tlimit);
  205.           IF savecgetc = SYN THEN
  206.              savecgetc := -2
  207.           ELSE
  208.           IF savecgetc = DLE THEN
  209.           BEGIN
  210.                savecgetc := cgetc(Tlimit);
  211.                IF savecgetc >= 0 THEN savecgetc := savecgetc XOr 64;
  212.           END;
  213.           dlecgetc := savecgetc;
  214.      END
  215.      ELSE
  216.      dlecgetc := cgetc(Tlimit);
  217. END;
  218.  
  219.